﻿#region 基本信息

/*
 * 作者：王玉才 (Wang Yucai)
 * 创建日期：2015-03-16 15:56:57
 * 电子邮件：SourceProStudio@outlook.com 或者 MasterDuner@yeah.net
 * 开发工具：Microsoft VisualStudio 2013 Ultimate Edition
 * 
 * 公共语言运行时(CLR)版本：4.0.30319.18444
 * 适用的.NET Framework SDK版本：3.5及其以上版本
 * 
 * 机器名：GLCHQWYCWINW7
 * 用户名：GUOCOLAND\wangyucai
 */

#endregion


using System;
using System.Data;
using System.Text.RegularExpressions;
using DeluxeSources.Practices.ObjectContracts.Internal;


namespace DeluxeSources.Practices.ObjectContracts
{
    /// <summary>
    /// <para>
    /// Excel 2003数据源
    /// </para>
    /// <para>
    /// 命名空间：<see cref="DeluxeSources.Practices.ObjectContracts"/>
    /// </para>
    /// <para>
    /// 类型名称：<see cref="ExcelDataItem"/>
    /// </para>
    /// <para>
    /// 此类型(<see cref="ExcelDataItem"/>)仅适用于3.5及其以上版本的.NET Framework SDK。
    /// </para>
    /// <para>
    /// 此类型是密闭的，不可以从此类型继承。
    /// </para>
    /// <para>
    /// © 2015 Wang Yucai.
    /// </para>
    /// </summary>
    /// <remarks>
    /// 此类型是密闭的，不可以从此类型继承。
    /// </remarks>
    public sealed class ExcelDataItem
    {
        private string _requisitionDepartment;
        private DateTime _preBuyingTime;
        private string _overallCategory;
        private string _detailsCategory;
        private string _name;
        private int _count;
        private decimal _price;
        private string _model;
        private string _unit;
        private decimal _totalAmount;
        private string _preDisposal;
        private string _reasonOfBuyNewOne;

        #region RequisitionDepartment
        /// <summary>
        /// 设置或获取申请部门。
        /// </summary>
        public string RequisitionDepartment
        {
            get { return _requisitionDepartment; }
            set { _requisitionDepartment = value; }
        }
        #endregion

        #region PreBuyingTime
        /// <summary>
        /// 设置或获取预购时间。
        /// </summary>
        public DateTime PreBuyingTime
        {
            get { return _preBuyingTime; }
            set { _preBuyingTime = value; }
        }
        #endregion

        #region OverallCategory
        /// <summary>
        /// 设置或获取总体分类。
        /// </summary>
        public string OverallCategory
        {
            get { return _overallCategory; }
            set { _overallCategory = value; }
        }
        #endregion

        #region DetailsCategory
        /// <summary>
        /// 设置或获取小分类名称。
        /// </summary>
        public string DetailsCategory
        {
            get { return _detailsCategory; }
            set { _detailsCategory = value; }
        }
        #endregion

        #region Name
        /// <summary>
        /// 设置或获取资产名称。
        /// </summary>
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        #endregion

        #region Count
        /// <summary>
        /// 设置或获取数量。
        /// </summary>
        public int Count
        {
            get { return _count; }
            set { _count = value; }
        }
        #endregion

        #region Price
        /// <summary>
        /// 设置或获取数据源。
        /// </summary>
        public decimal Price
        {
            get { return _price; }
            set { _price = value; }
        }
        #endregion

        #region Model
        /// <summary>
        /// 设置或获取规格型号。
        /// </summary>
        public string Model
        {
            get { return _model; }
            set { _model = value; }
        }
        #endregion

        #region Unit
        /// <summary>
        /// 设置或获取单位。
        /// </summary>
        public string Unit
        {
            get { return _unit; }
            set { _unit = value; }
        }
        #endregion

        #region TotalAmount
        /// <summary>
        /// 设置或获取合计金额。
        /// </summary>
        public decimal TotalAmount
        {
            get { return _totalAmount; }
            set { _totalAmount = value; }
        }
        #endregion

        #region PreDisposal
        /// <summary>
        /// 设置或获取预处置方式。
        /// </summary>
        public string PreDisposal
        {
            get { return _preDisposal; }
            set { _preDisposal = value; }
        }
        #endregion

        #region ReasonOfBuyNewOne
        /// <summary>
        /// 设置或获取购置原因。
        /// </summary>
        public string ReasonOfBuyNewOne
        {
            get { return _reasonOfBuyNewOne; }
            set { _reasonOfBuyNewOne = value; }
        }
        #endregion

        #region 构造函数

        /// <summary>
        /// <para>
        /// <see cref="ExcelDataItem"/>的构造函数：
        /// </para>
        /// <para>
        /// 用于初始化一个<see cref="ExcelDataItem"/>类型的对象实例。
        /// </para>
        /// <para>
        /// 此类型是密闭的，不可以从此类型继承。
        /// </para>
        /// </summary>
        public ExcelDataItem()
        {
        }

        /// <summary>
        /// <para>
        /// <see cref="ExcelDataItem"/>的构造函数：
        /// </para>
        /// <para>
        /// 用于初始化一个<see cref="ExcelDataItem"/>类型的对象实例。
        /// </para>
        /// <para>
        /// 此类型是密闭的，不可以从此类型继承。
        /// </para>
        /// </summary>
        /// <param name="singleLine">单行数据。</param>
        public ExcelDataItem(DataRow singleLine)
        {
            this.RequisitionDepartment = singleLine["申购部门"].IsNull() ? string.Empty : singleLine["申购部门"].ToString();
            this.PreBuyingTime = singleLine["预购置时间"].IsNull() || !IsValidDateFormat(singleLine["预购置时间"].ToString().Trim())
                ? DateTime.MinValue : DateTime.Parse(singleLine["预购置时间"].ToString().Trim());
            this.OverallCategory = singleLine["资产大类"].IsNull() ? string.Empty : singleLine["资产大类"].ToString();
            this.DetailsCategory = singleLine["资产小类"].IsNull() ? string.Empty : singleLine["资产小类"].ToString();
            this.Name = singleLine["资产名称"].IsNull() ? string.Empty : singleLine["资产名称"].ToString();
            this.Model = singleLine["规格型号"].IsNull() ? string.Empty : singleLine["规格型号"].ToString();
            this.Count = singleLine["数量"].IsNull() || !IsValidIntegerFormat(singleLine["数量"].ToString().Trim())
                ? int.MinValue : int.Parse(singleLine["数量"].ToString());
            this.Unit = singleLine["单位"].IsNull() ? string.Empty : singleLine["单位"].ToString();
            this.Price = singleLine["单价"].IsNull() || !IsValidCurrencyFormat(singleLine["单价"].ToString().Trim())
                ? decimal.MinusOne : decimal.Parse(singleLine["单价"].ToString().Trim());
            this.TotalAmount = singleLine["合计金额"].IsNull() || !IsValidCurrencyFormat(singleLine["合计金额"].ToString().Trim())
                ? decimal.MinusOne : decimal.Parse(singleLine["合计金额"].ToString().Trim());
            this.PreDisposal = singleLine["原同类设备预处置"].IsNull() ? string.Empty : singleLine["原同类设备预处置"].ToString();
            this.ReasonOfBuyNewOne = singleLine["购置理由"].IsNull() ? string.Empty : singleLine["购置理由"].ToString();
        }

        #endregion

        #region IsValidDateFormat
        /// <summary>
        /// 验证是否为正确的日期格式。
        /// </summary>
        /// <param name="str">日期字符串。</param>
        /// <returns></returns>
        static public bool IsValidDateFormat(string str)
        {
            return !string.IsNullOrEmpty(str)
                &&
                Regex.IsMatch(str, @"^[1-9]\d{3}\-((0(?=[1-9])[1-9])|(1(?=[0-2\-])[0-2\-])|([1-9](?=\-)))\-((0(?=[1-9])[1-9])|(1(?=\d?)\d?)|(2(?=\d?)\d?)|(3(?=[0-1]?)[0-1])|(\d{1}))(\s[0-1]?\d\:[0-5]?\d\:[0-5]?\d)?");
        }
        #endregion

        #region IsValidIntegerFormat
        /// <summary>
        /// 验证是否为正确的整数值格式。
        /// </summary>
        /// <param name="str">需要验证的字符串。</param>
        /// <returns>true or false。</returns>
        static public bool IsValidIntegerFormat(string str)
        {
            return !string.IsNullOrEmpty(str)
                &&
                Regex.IsMatch(str, @"^\d+$");
        }
        #endregion

        #region IsValidCurrencyFormat
        /// <summary>
        /// 验证是否为争取的货币格式。
        /// </summary>
        /// <param name="str">货币格式字符串。</param>
        /// <returns>true or false。</returns>
        static public bool IsValidCurrencyFormat(string str)
        {
            return !string.IsNullOrEmpty(str)
                &&
                Regex.IsMatch(str, @"^((0(?!\d+))|[1-9])\d*(\.\d{1,2})?$");
        }
        #endregion

        #region GetXmlContract
        /// <summary>
        /// 获取数据导入所需的XML契约表达式。
        /// </summary>
        /// <param name="index">数据索引。</param>
        /// <returns>XML契约表达式。</returns>
        public string GetXmlContract(int index)
        {
            return new XDataSourceGenerator()
            {
                DataInstance = this,
                Index = index
            }.TransformText();
        }
        #endregion
    }
}

#region 版权声明

/*
 * Copyright © 2015 Wang Yucai. All rights reserved.
 */

#endregion